package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomDate;
import br.com.telescope.adsrt.dom.DomId;
import br.com.telescope.adsrt.dom.DomInteger;
import br.com.telescope.adsrt.dom.DomOption;
import br.com.telescope.adsrt.dom.DomText;
import br.com.telescope.adsrt.dom.DomTextLong;
import br.com.telescope.adsrt.dom.DomUpper;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.adsrt.lib.AdsException;
import br.com.telescope.adsrt.lib.Form;
import br.com.telescope.sql.ModelQuery;
import br.com.telescope.t2.EntityBinding;
import br.com.telescope.t2.ModuleNavigator;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.exception.ApplicationRuntimeException;
import br.com.telescope.t2.exception.Severity;
import br.com.telescope.t2.feature.AbstractFeature;
import br.com.telescope.t2.feature.DeleteFeature;
import br.com.telescope.t2.feature.InsertFeature;
import br.com.telescope.t2.feature.ListFeature;
import br.com.telescope.t2.feature.LookupFeature;
import br.com.telescope.t2.feature.QueryFeature;
import br.com.telescope.t2.feature.UpdateFeature;
import br.com.telescope.t2.feature.ViewFeature;
import br.com.telescope.util.ObjectUtil;
import solutions.ferpa.ztest.ent.*;
import solutions.ferpa.ztest.intf.*;

/**
 * Instruções de trabalho.
 * <p>
 * Interface para manutenção de Instrução de trabalho
 * <P>
 * Telescope origin: ZTEST.CAD_INSTRUCAO_TRABALHO
 * <P>
 * Base entity: ZTEST.INSTRUCAO_TRABALHO
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class CadInstrucaoTrabalho extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "ZTEST.CAD_INSTRUCAO_TRABALHO";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Instruções de trabalho");
    }
    
    protected EntInstrucaoTrabalho base;
    protected EntPessoa aprv;
    protected EntPessoa elab;
    protected EntPlanoExecucao plne;
    protected EntInstrucaoTrabalho rec; // NEED_TJW1_COMPATIBILITY
    
    // Record items
    private DomUpper aNome;
    private DomText aTitulo;
    private DomInteger aRevisao;
    private DomOption aSituacao;
    private DomDate aDataElaboracao;
    private DomDate aDataAprovacao;
    private DomDate aDataDescontinuacao;
    private DomTextLong aMotivoDescontinuarInstrucao;
    private DomId aElaboradoPorId;
    private DomId aId;
    private DomId aAprovadoPorId;
    private DomId aPlanoExecucaoId;
    private DomUpper aAprvNomeApresentacao;
    private DomUpper aAprvNome;
    private DomUpper aAprvSobrenome;
    private DomUpper aAprvCodigo;
    private DomId aAprvUsuarioAssociadoId;
    private DomUpper aElabNomeApresentacao;
    private DomUpper aElabNome;
    private DomUpper aElabSobrenome;
    private DomUpper aElabCodigo;
    private DomId aElabUsuarioAssociadoId;
    private DomUpper aPlneNome;
    private DomOption aPlneSituacao;
    
    // Query items
    private DomUpper qElabNome;
    private DomUpper qElabSobrenome;
    private DomUpper qAprvSobrenome;
    private DomText qTitulo;
    private DomInteger qRevisao;
    private DomDate qDataElaboracao;
    private DomDate qDataAprovacao;
    private DomUpper qNome;
    private DomUpper qAprvNome;
    private DomUpper qElabCodigo;
    private DomDate qDataDescontinuacao;
    private DomUpper qPlneNome;
    private DomOption qSituacao;
    private DomUpper qAprvCodigo;
    
    @Override
    public String getBaseSql() {
        return "select BASE.*"
                + " , APRV.NOME_APRESENTACAO as APRV_NOME_APRESENTACAO"
                + " , APRV.NOME as APRV_NOME"
                + " , APRV.SOBRENOME as APRV_SOBRENOME"
                + " , APRV.CODIGO as APRV_CODIGO"
                + " , APRV.USUARIO_ASSOCIADO_ID as APRV_USUARIO_ASSOCIADO_ID"
                + " , ELAB.NOME_APRESENTACAO as ELAB_NOME_APRESENTACAO"
                + " , ELAB.NOME as ELAB_NOME"
                + " , ELAB.SOBRENOME as ELAB_SOBRENOME"
                + " , ELAB.CODIGO as ELAB_CODIGO"
                + " , ELAB.USUARIO_ASSOCIADO_ID as ELAB_USUARIO_ASSOCIADO_ID"
                + " , PLNE.NOME as PLNE_NOME"
                + " , PLNE.SITUACAO as PLNE_SITUACAO"
                + " , APRV.ID as Z_APRV_ID"
                + " , ELAB.ID as Z_ELAB_ID"
                + " , PLNE.ID as Z_PLNE_ID"
                + " from INSTRUCAO_TRABALHO BASE"
                + " left join PESSOA APRV on APRV.ID = BASE.APROVADO_POR_ID"
                + " join PESSOA ELAB on ELAB.ID = BASE.ELABORADO_POR_ID"
                + " join PLANO_EXECUCAO PLNE on PLNE.ID = BASE.PLANO_EXECUCAO_ID";
    }
    
    @Override
    public void initAttributes() {
        
        aNome = new DomUpper();
        aNome.context(ctx).name("NOME").label("Nome da instrução");
        
        aTitulo = new DomText();
        aTitulo.context(ctx).name("TITULO").label("Título da instrução");
        
        aRevisao = new DomInteger();
        aRevisao.context(ctx).name("REVISAO").label("Revisão da instrução");
        
        aSituacao = new DomOption();
        aSituacao.context(ctx).name("SITUACAO").label("Situação da instrução de trabalho").group(true);
        aSituacao.addOption("E", "Em elaboração");
        aSituacao.addOption("G", "Aguardando aprovação");
        aSituacao.addOption("A", "Aprovada");
        aSituacao.addOption("D", "Descontinuada");
        aSituacao.setDefaultValue("E");
        
        aDataElaboracao = new DomDate();
        aDataElaboracao.context(ctx).name("DATA_ELABORACAO").label("Data da elaboração");
        
        aDataAprovacao = new DomDate();
        aDataAprovacao.context(ctx).name("DATA_APROVACAO").label("Data da aprovação");
        
        aDataDescontinuacao = new DomDate();
        aDataDescontinuacao.context(ctx).name("DATA_DESCONTINUACAO").label("Data (instrução descontinuada)");
        
        aMotivoDescontinuarInstrucao = new DomTextLong();
        aMotivoDescontinuarInstrucao.context(ctx).name("MOTIVO_DESCONTINUAR_INSTRUCAO").label("Motivo (descontinuar instrução)");
        
        aElaboradoPorId = new DomId();
        aElaboradoPorId.context(ctx).name("ELABORADO_POR_ID").label("Elaborado por");
        
        aId = new DomId();
        aId.context(ctx).name("ID").label("Id");
        
        aAprovadoPorId = new DomId();
        aAprovadoPorId.context(ctx).name("APROVADO_POR_ID").label("Aprovado por");
        
        aPlanoExecucaoId = new DomId();
        aPlanoExecucaoId.context(ctx).name("PLANO_EXECUCAO_ID").label("Plano de execução");
        
        aAprvNomeApresentacao = new DomUpper();
        aAprvNomeApresentacao.context(ctx).name("APRV_NOME_APRESENTACAO").label("Aprovado por");
        aAprvNomeApresentacao.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME_APRESENTACAO as valor"
                + " , NOME_APRESENTACAO as pesquisar"
                + " , NOME_APRESENTACAO as descricao"
                + " from PESSOA APRV)", "q"));
        aAprvNomeApresentacao.setAutocompleteLength(2);
        
        aAprvNome = new DomUpper();
        aAprvNome.context(ctx).name("APRV_NOME").label("Nome (aprovado por)");
        aAprvNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from PESSOA APRV)", "q"));
        aAprvNome.setAutocompleteLength(2);
        
        aAprvSobrenome = new DomUpper();
        aAprvSobrenome.context(ctx).name("APRV_SOBRENOME").label("Sobrenome (aprovado por)");
        aAprvSobrenome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT SOBRENOME as valor"
                + " , SOBRENOME as pesquisar"
                + " , SOBRENOME as descricao"
                + " from PESSOA APRV)", "q"));
        aAprvSobrenome.setAutocompleteLength(2);
        
        aAprvCodigo = new DomUpper();
        aAprvCodigo.context(ctx).name("APRV_CODIGO").label("Cód. (aprovado por)");
        aAprvCodigo.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT CODIGO as valor"
                + " , CODIGO as pesquisar"
                + " , CODIGO as descricao"
                + " from PESSOA APRV)", "q"));
        aAprvCodigo.setAutocompleteLength(2);
        
        aAprvUsuarioAssociadoId = new DomId();
        aAprvUsuarioAssociadoId.context(ctx).name("APRV_USUARIO_ASSOCIADO_ID").label("Usuário associado");
        aAprvUsuarioAssociadoId.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT USUARIO_ASSOCIADO_ID as valor"
                + " , USUARIO_ASSOCIADO_ID as pesquisar"
                + " , USUARIO_ASSOCIADO_ID as descricao"
                + " from PESSOA APRV)", "q"));
        aAprvUsuarioAssociadoId.setAutocompleteLength(2);
        
        aElabNomeApresentacao = new DomUpper();
        aElabNomeApresentacao.context(ctx).name("ELAB_NOME_APRESENTACAO").label("Elaborado por");
        aElabNomeApresentacao.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME_APRESENTACAO as valor"
                + " , NOME_APRESENTACAO as pesquisar"
                + " , NOME_APRESENTACAO as descricao"
                + " from PESSOA ELAB)", "q"));
        aElabNomeApresentacao.setAutocompleteLength(2);
        
        aElabNome = new DomUpper();
        aElabNome.context(ctx).name("ELAB_NOME").label("Nome (quem elabora)");
        aElabNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from PESSOA ELAB)", "q"));
        aElabNome.setAutocompleteLength(2);
        
        aElabSobrenome = new DomUpper();
        aElabSobrenome.context(ctx).name("ELAB_SOBRENOME").label("Sobrenome (quem elabora)");
        aElabSobrenome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT SOBRENOME as valor"
                + " , SOBRENOME as pesquisar"
                + " , SOBRENOME as descricao"
                + " from PESSOA ELAB)", "q"));
        aElabSobrenome.setAutocompleteLength(2);
        
        aElabCodigo = new DomUpper();
        aElabCodigo.context(ctx).name("ELAB_CODIGO").label("Cód. (quem elabora)");
        aElabCodigo.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT CODIGO as valor"
                + " , CODIGO as pesquisar"
                + " , CODIGO as descricao"
                + " from PESSOA ELAB)", "q"));
        aElabCodigo.setAutocompleteLength(2);
        
        aElabUsuarioAssociadoId = new DomId();
        aElabUsuarioAssociadoId.context(ctx).name("ELAB_USUARIO_ASSOCIADO_ID").label("Usuário associado");
        aElabUsuarioAssociadoId.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT USUARIO_ASSOCIADO_ID as valor"
                + " , USUARIO_ASSOCIADO_ID as pesquisar"
                + " , USUARIO_ASSOCIADO_ID as descricao"
                + " from PESSOA ELAB)", "q"));
        aElabUsuarioAssociadoId.setAutocompleteLength(2);
        
        aPlneNome = new DomUpper();
        aPlneNome.context(ctx).name("PLNE_NOME").label("Nome do plano de execução");
        aPlneNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from PLANO_EXECUCAO PLNE)", "q"));
        aPlneNome.setAutocompleteLength(2);
        
        aPlneSituacao = new DomOption();
        aPlneSituacao.context(ctx).name("PLNE_SITUACAO").label("Situação do plano").group(true);
        aPlneSituacao.addOption("E", "Em elaboração");
        aPlneSituacao.addOption("A", "Aprovado");
        aPlneSituacao.addOption("D", "Descontinuado");
        aPlneSituacao.setDefaultValue("E");
        
        
        qElabNome = new DomUpper();
        qElabNome.context(ctx).name("ELAB_NOME").label("Nome (quem elabora)");
        qElabNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from PESSOA ELAB)", "q"));
        qElabNome.setAutocompleteLength(2);
        
        qElabSobrenome = new DomUpper();
        qElabSobrenome.context(ctx).name("ELAB_SOBRENOME").label("Sobrenome (quem elabora)");
        qElabSobrenome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT SOBRENOME as valor"
                + " , SOBRENOME as pesquisar"
                + " , SOBRENOME as descricao"
                + " from PESSOA ELAB)", "q"));
        qElabSobrenome.setAutocompleteLength(2);
        
        qAprvSobrenome = new DomUpper();
        qAprvSobrenome.context(ctx).name("APRV_SOBRENOME").label("Sobrenome (aprovado por)");
        qAprvSobrenome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT SOBRENOME as valor"
                + " , SOBRENOME as pesquisar"
                + " , SOBRENOME as descricao"
                + " from PESSOA APRV)", "q"));
        qAprvSobrenome.setAutocompleteLength(2);
        
        qTitulo = new DomText();
        qTitulo.context(ctx).name("TITULO").label("Título da instrução");
        
        qRevisao = new DomInteger();
        qRevisao.context(ctx).name("REVISAO").label("Revisão da instrução");
        
        qDataElaboracao = new DomDate();
        qDataElaboracao.context(ctx).name("DATA_ELABORACAO").label("Data da elaboração");
        
        qDataAprovacao = new DomDate();
        qDataAprovacao.context(ctx).name("DATA_APROVACAO").label("Data da aprovação");
        
        qNome = new DomUpper();
        qNome.context(ctx).name("NOME").label("Nome da instrução");
        
        qAprvNome = new DomUpper();
        qAprvNome.context(ctx).name("APRV_NOME").label("Nome (aprovado por)");
        qAprvNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from PESSOA APRV)", "q"));
        qAprvNome.setAutocompleteLength(2);
        
        qElabCodigo = new DomUpper();
        qElabCodigo.context(ctx).name("ELAB_CODIGO").label("Cód. (quem elabora)");
        qElabCodigo.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT CODIGO as valor"
                + " , CODIGO as pesquisar"
                + " , CODIGO as descricao"
                + " from PESSOA ELAB)", "q"));
        qElabCodigo.setAutocompleteLength(2);
        
        qDataDescontinuacao = new DomDate();
        qDataDescontinuacao.context(ctx).name("DATA_DESCONTINUACAO").label("Data (instrução descontinuada)");
        
        qPlneNome = new DomUpper();
        qPlneNome.context(ctx).name("PLNE_NOME").label("Nome do plano de execução");
        qPlneNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from PLANO_EXECUCAO PLNE)", "q"));
        qPlneNome.setAutocompleteLength(2);
        
        qSituacao = new DomOption();
        qSituacao.context(ctx).name("SITUACAO").label("Situação da instrução de trabalho");
        qSituacao.addOption("E", "Em elaboração");
        qSituacao.addOption("G", "Aguardando aprovação");
        qSituacao.addOption("A", "Aprovada");
        qSituacao.addOption("D", "Descontinuada");
        
        qAprvCodigo = new DomUpper();
        qAprvCodigo.context(ctx).name("APRV_CODIGO").label("Cód. (aprovado por)");
        qAprvCodigo.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT CODIGO as valor"
                + " , CODIGO as pesquisar"
                + " , CODIGO as descricao"
                + " from PESSOA APRV)", "q"));
        qAprvCodigo.setAutocompleteLength(2);
    }
    
    @Override
    public void initEntityBindings() {
        EntityBinding binding;
        
        binding = new EntityBinding("ZTEST.PLANO_EXECUCAO", "PLNE", "Z_PLNE_ID", "ZTEST.CAD_PLANO_EXECUCAO.VIEW");
        binding.addFields(aPlneNome, aPlneSituacao);
        entityBindings.add(binding);
    }
    
    @Override
    public String getQueryPkColumn() {
        return "BASE.ID";
    }
    
    @Override
    public void setId(String value) {
        this.aId.setValue(value);
    }
    
    @Override
    public EntInstrucaoTrabalho getRecord() {
        if (base == null) {
            base = new EntInstrucaoTrabalho(ctx);
            rec = base;
        }
        return this.base;
    }
    
    @Override
    public String getContextName() {
        return aNome.toText();
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "NOME, REVISAO, PLNE_NOME, SITUACAO";
    }
    
    @Override
    public void translateInsertFks(Form form) {
        ModelQuery query;
        
        // ELABORADO_POR_ID
        try {
            if (form.hasFields("ELAB_NOME_APRESENTACAO")) {
                query = createQuery()
                        .select("ELAB.ID")
                        .from("PESSOA", "ELAB")
                        .filter("ELAB.NOME_APRESENTACAO", form.get("ELAB_NOME_APRESENTACAO"))
                        ;
                base.setElaboradoPorId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
        
        // PLANO_EXECUCAO_ID
        try {
            if (form.hasFields("PLNE_NOME")) {
                query = createQuery()
                        .select("PLNE.ID")
                        .from("PLANO_EXECUCAO", "PLNE")
                        .filter("PLNE.NOME", form.get("PLNE_NOME"))
                        ;
                base.setPlanoExecucaoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    
    @Override
    public void translateUpdateFks(Form form) {
        ModelQuery query;
        
        // ELABORADO_POR_ID
        try {
            if (form.hasFields("ELAB_NOME_APRESENTACAO")) {
                query = createQuery()
                        .select("ELAB.ID")
                        .from("PESSOA", "ELAB")
                        .filter("ELAB.NOME_APRESENTACAO", form.get("ELAB_NOME_APRESENTACAO"))
                        ;
                base.setElaboradoPorId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
        
        // PLANO_EXECUCAO_ID
        try {
            if (form.hasFields("PLNE_NOME")) {
                query = createQuery()
                        .select("PLNE.ID")
                        .from("PLANO_EXECUCAO", "PLNE")
                        .filter("PLNE.NOME", form.get("PLNE_NOME"))
                        ;
                base.setPlanoExecucaoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    
    @Override
    public ModuleNavigator getDefaultModuleNavigator() {
        return new ModInstrab();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="QUERY">
    public class FQuery extends QueryFeature {
        
        @Override
        public void initForm() {
            addField(qNome, "opt");
            addField(qTitulo, "opt");
            addField(qRevisao, "opt");
            addField(qPlneNome, "opt");
            addField(qSituacao, "opt");
            addField(qDataElaboracao, "opt");
            addField(qElabNome, "opt");
            addField(qElabSobrenome, "opt");
            addField(qElabCodigo, "opt");
            addField(qDataAprovacao, "opt");
            addField(qAprvNome, "opt");
            addField(qAprvSobrenome, "opt");
            addField(qAprvCodigo, "opt");
            addField(qDataDescontinuacao, "opt");
        }
        
        {
            setFeatureName("QUERY");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="LIST">
    public class FList extends ListFeature {
        
        @Override
        public void initForm() {
            addField(aNome, "view");
            addField(aRevisao, "view");
            addField(aPlneNome, "view");
            addField(aSituacao, "view");
            addField(aDataElaboracao, "view");
            addField(aElabNomeApresentacao, "view");
            addField(aDataAprovacao, "view");
            addField(aAprvNomeApresentacao, "view");
            addField(aDataDescontinuacao, "view");
        }
        
        {
            setFeatureName("LIST");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="VIEW">
    public class FView extends ViewFeature {
        
        @Override
        public void initForm() {
            addField(aNome, "view");
            addField(aTitulo, "view");
            addField(aRevisao, "view");
            addField(aPlneNome, "view");
            addField(aPlneSituacao, "view");
            addField(aSituacao, "view");
            addField(aDataElaboracao, "view");
            addField(aElabNomeApresentacao, "view");
            addField(aElabNome, "view");
            addField(aElabSobrenome, "view");
            addField(aElabCodigo, "view");
            addField(aDataAprovacao, "view");
            addField(aAprvNomeApresentacao, "view");
            addField(aAprvNome, "view");
            addField(aAprvSobrenome, "view");
            addField(aAprvCodigo, "view");
            addField(aDataDescontinuacao, "view");
        }
        
        @Override
        public void preDisplay() {
            try {
                desabilitarAcoesInterface();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        @Override
        public void posDisplay() {
            {
                CadItemInstrucao external = new CadItemInstrucao();
                external.setRuntime(ctx.clone());
                external.init();
                AbstractFeature feature = external.getFeature("ETAPAS_INSTRUCAO");
                external.setParameterIdInstrucaoTrabalho(aId.getValue());
                external.setDetail(true);
                feature.run();
            }
        }
        
        @Override
        public void onAction() {
            addSubmit(getFeature("APROVAR_INSTRUCAO")).label("Aprovar instrução");
            addSubmit(getFeature("DESCONTINUAR_INSTRUCAO")).label("Descontinuar Instrução");
        }
        
        {
            setFeatureName("VIEW");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="INSERT">
    public class FInsert extends InsertFeature {
        
        @Override
        public void initForm() {
            aNome.setOptional(false);
            addField(aNome, "rqd");
            aTitulo.setOptional(false);
            addField(aTitulo, "rqd");
            aRevisao.setOptional(false);
            addField(aRevisao, "rqd");
            aPlneNome.setOptional(false);
            addField(aPlneNome, "rqd");
            aPlneSituacao.setEditable(false);
            addField(aPlneSituacao, "view");
            addField(aDataElaboracao, "opt");
            aElabNomeApresentacao.setOptional(false);
            addField(aElabNomeApresentacao, "rqd");
            aElabNome.setEditable(false);
            addField(aElabNome, "view");
            aElabSobrenome.setEditable(false);
            addField(aElabSobrenome, "view");
            aElabCodigo.setEditable(false);
            addField(aElabCodigo, "view");
        }
        
        {
            setFeatureName("INSERT");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="UPDATE">
    public class FUpdate extends UpdateFeature {
        
        @Override
        public void initForm() {
            aNome.setOptional(false);
            addField(aNome, "rqd");
            aTitulo.setOptional(false);
            addField(aTitulo, "rqd");
            aRevisao.setOptional(false);
            addField(aRevisao, "rqd");
            aPlneNome.setOptional(false);
            addField(aPlneNome, "rqd");
            aPlneSituacao.setEditable(false);
            addField(aPlneSituacao, "view");
            aSituacao.setEditable(false);
            addField(aSituacao, "view");
            addField(aDataElaboracao, "opt");
            aElabNomeApresentacao.setOptional(false);
            addField(aElabNomeApresentacao, "rqd");
            aElabNome.setEditable(false);
            addField(aElabNome, "view");
            aElabSobrenome.setEditable(false);
            addField(aElabSobrenome, "view");
            aElabCodigo.setEditable(false);
            addField(aElabCodigo, "view");
            aDataAprovacao.setEditable(false);
            addField(aDataAprovacao, "view");
            aAprvNomeApresentacao.setEditable(false);
            addField(aAprvNomeApresentacao, "view");
            aAprvNome.setEditable(false);
            addField(aAprvNome, "view");
            aAprvSobrenome.setEditable(false);
            addField(aAprvSobrenome, "view");
            aAprvCodigo.setEditable(false);
            addField(aAprvCodigo, "view");
            aDataDescontinuacao.setEditable(false);
            addField(aDataDescontinuacao, "view");
            aMotivoDescontinuarInstrucao.setEditable(false);
            addField(aMotivoDescontinuarInstrucao, "view");
        }
        
        {
            setFeatureName("UPDATE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="DELETE">
    public class FDelete extends DeleteFeature {
        
        @Override
        public void initForm() {
            addField(aNome, "view");
            addField(aTitulo, "view");
            addField(aRevisao, "view");
            addField(aPlneNome, "view");
            addField(aElabNomeApresentacao, "view");
            addField(aAprvNomeApresentacao, "view");
        }
        
        {
            setFeatureName("DELETE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="APROVAR_INSTRUCAO">
    public class FAprovarInstrucao extends UpdateFeature {
        
        @Override
        public void initForm() {
            aNome.setEditable(false);
            addField(aNome, "view");
            aTitulo.setEditable(false);
            addField(aTitulo, "view");
            aRevisao.setEditable(false);
            addField(aRevisao, "view");
            aPlneNome.setEditable(false);
            addField(aPlneNome, "view");
            aPlneSituacao.setEditable(false);
            addField(aPlneSituacao, "view");
            aSituacao.setEditable(false);
            addField(aSituacao, "view");
            aDataElaboracao.setEditable(false);
            addField(aDataElaboracao, "view");
            aElabNomeApresentacao.setEditable(false);
            addField(aElabNomeApresentacao, "view");
            aElabNome.setEditable(false);
            addField(aElabNome, "view");
            aElabSobrenome.setEditable(false);
            addField(aElabSobrenome, "view");
            aElabCodigo.setEditable(false);
            addField(aElabCodigo, "view");
            aDataAprovacao.setOptional(false);
            addField(aDataAprovacao, "rqd");
            aAprvNomeApresentacao.setOptional(false);
            addField(aAprvNomeApresentacao, "rqd");
            aAprvNome.setEditable(false);
            addField(aAprvNome, "view");
            aAprvSobrenome.setEditable(false);
            addField(aAprvSobrenome, "view");
            aAprvCodigo.setEditable(false);
            addField(aAprvCodigo, "view");
            aDataDescontinuacao.setEditable(false);
            addField(aDataDescontinuacao, "view");
            aMotivoDescontinuarInstrucao.setEditable(false);
            addField(aMotivoDescontinuarInstrucao, "view");
        }
        
        {
            setFeatureName("APROVAR_INSTRUCAO");
            setTitle("Aprovar instrução");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="DESCONTINUAR_INSTRUCAO">
    public class FDescontinuarInstrucao extends UpdateFeature {
        
        @Override
        public void initForm() {
            aNome.setEditable(false);
            addField(aNome, "view");
            aTitulo.setEditable(false);
            addField(aTitulo, "view");
            aRevisao.setEditable(false);
            addField(aRevisao, "view");
            aPlneNome.setEditable(false);
            addField(aPlneNome, "view");
            aPlneSituacao.setEditable(false);
            addField(aPlneSituacao, "view");
            aSituacao.setEditable(false);
            addField(aSituacao, "view");
            aDataElaboracao.setEditable(false);
            addField(aDataElaboracao, "view");
            aElabNomeApresentacao.setEditable(false);
            addField(aElabNomeApresentacao, "view");
            aElabNome.setEditable(false);
            addField(aElabNome, "view");
            aElabSobrenome.setEditable(false);
            addField(aElabSobrenome, "view");
            aElabCodigo.setEditable(false);
            addField(aElabCodigo, "view");
            aDataAprovacao.setEditable(false);
            addField(aDataAprovacao, "view");
            aAprvNomeApresentacao.setEditable(false);
            addField(aAprvNomeApresentacao, "view");
            aAprvNome.setEditable(false);
            addField(aAprvNome, "view");
            aAprvSobrenome.setEditable(false);
            addField(aAprvSobrenome, "view");
            aAprvCodigo.setEditable(false);
            addField(aAprvCodigo, "view");
            aDataDescontinuacao.setOptional(false);
            addField(aDataDescontinuacao, "rqd");
            aMotivoDescontinuarInstrucao.setOptional(false);
            addField(aMotivoDescontinuarInstrucao, "rqd");
        }
        
        {
            setFeatureName("DESCONTINUAR_INSTRUCAO");
            setTitle("Descontinuar Instrução");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="APRV_NOME_APRESENTACAO_LOOKUP">
    public class FAprvNomeApresentacaoLookup extends LookupFeature {
        
        @Override
        public void initForm() {
            aAprvNomeApresentacao.setEditable(true);
            addField(aAprvNomeApresentacao, "opt");
            aAprvNome.setEditable(false);
            addField(aAprvNome, "view");
            aAprvSobrenome.setEditable(false);
            addField(aAprvSobrenome, "view");
            aAprvCodigo.setEditable(false);
            addField(aAprvCodigo, "view");
            aAprvUsuarioAssociadoId.setEditable(false);
            addField(aAprvUsuarioAssociadoId, "view");
        }
        
        @Override
        public ModelQuery getLookupQuery() {
            return createQuery()
                    .select("APRV.NOME_APRESENTACAO as APRV_NOME_APRESENTACAO")
                    .select("APRV.NOME as APRV_NOME")
                    .select("APRV.SOBRENOME as APRV_SOBRENOME")
                    .select("APRV.CODIGO as APRV_CODIGO")
                    .select("APRV.USUARIO_ASSOCIADO_ID as APRV_USUARIO_ASSOCIADO_ID")
                    .from("PESSOA", "APRV")
                    ;
        }
        
        {
            setFeatureName("APRV_NOME_APRESENTACAO_LOOKUP");
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="ELAB_NOME_APRESENTACAO_LOOKUP">
    public class FElabNomeApresentacaoLookup extends LookupFeature {
        
        @Override
        public void initForm() {
            aElabNomeApresentacao.setEditable(true);
            addField(aElabNomeApresentacao, "opt");
            aElabNome.setEditable(false);
            addField(aElabNome, "view");
            aElabSobrenome.setEditable(false);
            addField(aElabSobrenome, "view");
            aElabCodigo.setEditable(false);
            addField(aElabCodigo, "view");
            aElabUsuarioAssociadoId.setEditable(false);
            addField(aElabUsuarioAssociadoId, "view");
        }
        
        @Override
        public ModelQuery getLookupQuery() {
            return createQuery()
                    .select("ELAB.NOME_APRESENTACAO as ELAB_NOME_APRESENTACAO")
                    .select("ELAB.NOME as ELAB_NOME")
                    .select("ELAB.SOBRENOME as ELAB_SOBRENOME")
                    .select("ELAB.CODIGO as ELAB_CODIGO")
                    .select("ELAB.USUARIO_ASSOCIADO_ID as ELAB_USUARIO_ASSOCIADO_ID")
                    .from("PESSOA", "ELAB")
                    ;
        }
        
        {
            setFeatureName("ELAB_NOME_APRESENTACAO_LOOKUP");
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="PLNE_NOME_LOOKUP">
    public class FPlneNomeLookup extends LookupFeature {
        
        @Override
        public void initForm() {
            aPlneNome.setEditable(true);
            addField(aPlneNome, "opt");
            aPlneSituacao.setEditable(false);
            addField(aPlneSituacao, "view");
        }
        
        @Override
        public ModelQuery getLookupQuery() {
            return createQuery()
                    .select("PLNE.NOME as PLNE_NOME")
                    .select("PLNE.SITUACAO as PLNE_SITUACAO")
                    .from("PLANO_EXECUCAO", "PLNE")
                    ;
        }
        
        {
            setFeatureName("PLNE_NOME_LOOKUP");
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FQuery());
        addFeature(new FList());
        addFeature(new FView());
        addFeature(new FInsert());
        addFeature(new FUpdate());
        addFeature(new FDelete());
        addFeature(new FAprovarInstrucao());
        addFeature(new FDescontinuarInstrucao());
        addFeature(new FAprvNomeApresentacaoLookup());
        addFeature(new FElabNomeApresentacaoLookup());
        addFeature(new FPlneNomeLookup());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "QUERY";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    public String getNome() {
        return aNome.getValue();
    }
    
    public void setNome(String value) {
        this.aNome.setValue(value);
    }
    
    public String getTitulo() {
        return aTitulo.getValue();
    }
    
    public void setTitulo(String value) {
        this.aTitulo.setValue(value);
    }
    
    public Integer getRevisao() {
        return aRevisao.getValue();
    }
    
    public void setRevisao(Integer value) {
        this.aRevisao.setValue(value);
    }
    
    public String getSituacao() {
        return aSituacao.getValue();
    }
    
    public void setSituacao(String value) {
        this.aSituacao.setValue(value);
    }
    
    public java.sql.Date getDataElaboracao() {
        return aDataElaboracao.getValue();
    }
    
    public void setDataElaboracao(java.sql.Date value) {
        this.aDataElaboracao.setValue(value);
    }
    
    public java.sql.Date getDataAprovacao() {
        return aDataAprovacao.getValue();
    }
    
    public void setDataAprovacao(java.sql.Date value) {
        this.aDataAprovacao.setValue(value);
    }
    
    public java.sql.Date getDataDescontinuacao() {
        return aDataDescontinuacao.getValue();
    }
    
    public void setDataDescontinuacao(java.sql.Date value) {
        this.aDataDescontinuacao.setValue(value);
    }
    
    public String getMotivoDescontinuarInstrucao() {
        return aMotivoDescontinuarInstrucao.getValue();
    }
    
    public void setMotivoDescontinuarInstrucao(String value) {
        this.aMotivoDescontinuarInstrucao.setValue(value);
    }
    
    public Long getElaboradoPorId() {
        return aElaboradoPorId.getValue();
    }
    
    public void setElaboradoPorId(Long value) {
        this.aElaboradoPorId.setValue(value);
    }
    
    @Override
    public Long getId() {
        return aId.getValue();
    }
    
    public void setId(Long value) {
        this.aId.setValue(value);
    }
    
    public Long getAprovadoPorId() {
        return aAprovadoPorId.getValue();
    }
    
    public void setAprovadoPorId(Long value) {
        this.aAprovadoPorId.setValue(value);
    }
    
    public Long getPlanoExecucaoId() {
        return aPlanoExecucaoId.getValue();
    }
    
    public void setPlanoExecucaoId(Long value) {
        this.aPlanoExecucaoId.setValue(value);
    }
    
    public String getAprvNomeApresentacao() {
        return aAprvNomeApresentacao.getValue();
    }
    
    public void setAprvNomeApresentacao(String value) {
        this.aAprvNomeApresentacao.setValue(value);
    }
    
    public String getAprvNome() {
        return aAprvNome.getValue();
    }
    
    public void setAprvNome(String value) {
        this.aAprvNome.setValue(value);
    }
    
    public String getAprvSobrenome() {
        return aAprvSobrenome.getValue();
    }
    
    public void setAprvSobrenome(String value) {
        this.aAprvSobrenome.setValue(value);
    }
    
    public String getAprvCodigo() {
        return aAprvCodigo.getValue();
    }
    
    public void setAprvCodigo(String value) {
        this.aAprvCodigo.setValue(value);
    }
    
    public Long getAprvUsuarioAssociadoId() {
        return aAprvUsuarioAssociadoId.getValue();
    }
    
    public void setAprvUsuarioAssociadoId(Long value) {
        this.aAprvUsuarioAssociadoId.setValue(value);
    }
    
    public String getElabNomeApresentacao() {
        return aElabNomeApresentacao.getValue();
    }
    
    public void setElabNomeApresentacao(String value) {
        this.aElabNomeApresentacao.setValue(value);
    }
    
    public String getElabNome() {
        return aElabNome.getValue();
    }
    
    public void setElabNome(String value) {
        this.aElabNome.setValue(value);
    }
    
    public String getElabSobrenome() {
        return aElabSobrenome.getValue();
    }
    
    public void setElabSobrenome(String value) {
        this.aElabSobrenome.setValue(value);
    }
    
    public String getElabCodigo() {
        return aElabCodigo.getValue();
    }
    
    public void setElabCodigo(String value) {
        this.aElabCodigo.setValue(value);
    }
    
    public Long getElabUsuarioAssociadoId() {
        return aElabUsuarioAssociadoId.getValue();
    }
    
    public void setElabUsuarioAssociadoId(Long value) {
        this.aElabUsuarioAssociadoId.setValue(value);
    }
    
    public String getPlneNome() {
        return aPlneNome.getValue();
    }
    
    public void setPlneNome(String value) {
        this.aPlneNome.setValue(value);
    }
    
    public String getPlneSituacao() {
        return aPlneSituacao.getValue();
    }
    
    public void setPlneSituacao(String value) {
        this.aPlneSituacao.setValue(value);
    }
    public String getQueryNome() {
        return qNome.getQueryValue();
    }
    
    public void setQueryNome(String value) {
        this.qNome.setQueryValue(value);
    }
    public String getQueryTitulo() {
        return qTitulo.getQueryValue();
    }
    
    public void setQueryTitulo(String value) {
        this.qTitulo.setQueryValue(value);
    }
    public String getQueryRevisao() {
        return qRevisao.getQueryValue();
    }
    
    public void setQueryRevisao(String value) {
        this.qRevisao.setQueryValue(value);
    }
    public String getQueryPlneNome() {
        return qPlneNome.getQueryValue();
    }
    
    public void setQueryPlneNome(String value) {
        this.qPlneNome.setQueryValue(value);
    }
    public String getQuerySituacao() {
        return qSituacao.getQueryValue();
    }
    
    public void setQuerySituacao(String value) {
        this.qSituacao.setQueryValue(value);
    }
    public String getQueryDataElaboracao() {
        return qDataElaboracao.getQueryValue();
    }
    
    public void setQueryDataElaboracao(String value) {
        this.qDataElaboracao.setQueryValue(value);
    }
    public String getQueryElabNome() {
        return qElabNome.getQueryValue();
    }
    
    public void setQueryElabNome(String value) {
        this.qElabNome.setQueryValue(value);
    }
    public String getQueryElabSobrenome() {
        return qElabSobrenome.getQueryValue();
    }
    
    public void setQueryElabSobrenome(String value) {
        this.qElabSobrenome.setQueryValue(value);
    }
    public String getQueryElabCodigo() {
        return qElabCodigo.getQueryValue();
    }
    
    public void setQueryElabCodigo(String value) {
        this.qElabCodigo.setQueryValue(value);
    }
    public String getQueryDataAprovacao() {
        return qDataAprovacao.getQueryValue();
    }
    
    public void setQueryDataAprovacao(String value) {
        this.qDataAprovacao.setQueryValue(value);
    }
    public String getQueryAprvNome() {
        return qAprvNome.getQueryValue();
    }
    
    public void setQueryAprvNome(String value) {
        this.qAprvNome.setQueryValue(value);
    }
    public String getQueryAprvSobrenome() {
        return qAprvSobrenome.getQueryValue();
    }
    
    public void setQueryAprvSobrenome(String value) {
        this.qAprvSobrenome.setQueryValue(value);
    }
    public String getQueryAprvCodigo() {
        return qAprvCodigo.getQueryValue();
    }
    
    public void setQueryAprvCodigo(String value) {
        this.qAprvCodigo.setQueryValue(value);
    }
    public String getQueryDataDescontinuacao() {
        return qDataDescontinuacao.getQueryValue();
    }
    
    public void setQueryDataDescontinuacao(String value) {
        this.qDataDescontinuacao.setQueryValue(value);
    }
    // </editor-fold>
    
    /**
     * Desabilitar ações da interface.
     */
    private void desabilitarAcoesInterface() throws AdsException {
        // <user-code id="20835715" parentId="20835711" hashcode="4c099bf8" length="438">
        // import br.com.telescope.t2.exception.Severity;
        
        if (getRecord().valueOfSituacao().equals("E")) {  // em elaboração
            getForm().delAction("APROVAR_INSTRUCAO");
            //getForm().delAction("DESCONTINUAR_INSTRUCAO");
        } else if (getRecord().valueOfSituacao().equals("A")) {
            getForm().delAction("APROVAR_INSTRUCAO");
        } else if (getRecord().valueOfSituacao().equals("D")) {
            getForm().delAction("DESCONTINUAR_INSTRUCAO");
        }
        
        // </user-code>
    }
    
    @Override
    public String getJsServiceFile() {
        return "ui/ztest/cad_instrucao_trabalho.js";
    }
}
